function add (x,y,z) {
  return x+y+z
}

// 柯里化工具函数
function jingeCurrying (fn) {
  function curried (...args) {
    // 判断当前传入的参数是否和函数需要的参数一致
    if(args.length >= fn.length) {
      // 一致，执行函数，apply防止this指向被改变
      return fn.apply(this,args)
    }else{
      // 不一致，返回函数
      return function (...args2) {
        // 继续返回curried的执行，判断参数是否一致
        return curried.apply(this,[...args,...args2])
      }
    }
  }
  // 返回柯里化函数
  return curried
}

const newCurryin = jingeCurrying(add)

console.log(newCurryin(10,20,30));
console.log(newCurryin(10,20)(30));
console.log(newCurryin(10)(20)(30));